package com.company.ThreadPoolDemo;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 作者  Administrator
 * 时间  2017/6/2 11:21
 * 文件  ThreadPoolsDemo
 * 描述  自定义线程池
 * 使用   一个优先级的队列PriorityBlockingQueue,该队列中的Runnable 需要实现Comparable接口
 *
 */
public class CustomizeThreadPool {

	public static void main(String[] args) {
		// 创建3个核心线程；其他线程全部等待
		// 优先级高的放在队列前面先处理
		ExecutorService priorityThreadPool = new ThreadPoolExecutor(3, 3, 0L,
				TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());

		for (int i = 1; i <= 5; i++) {
			final int priority = i;
			priorityThreadPool.execute(new PriorityRunnable(priority) {
				@Override
				public void doSth() {
					String threadName = Thread.currentThread().getName();
					System.out.println("线程：" + threadName + ",正在执行优先级为：" + priority + "的任务");
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
	}

	/**
	 * 比较优先级;
	 * */
	public abstract static class PriorityRunnable implements Runnable, Comparable<PriorityRunnable> {
		private int priority;

		public PriorityRunnable(int priority) {
			if (priority < 0)
				throw new IllegalArgumentException();
			this.priority = priority;
		}

		// 负 当前的优先级小| 正 当前的大|0 相同

		@Override
		public int compareTo(PriorityRunnable another) {
			int my = this.getPriority();
			int other = another.getPriority();
			return my < other ? 1 : my > other ? -1 : 0;
		}

		@Override
		public void run() {
			doSth();
		}

		public abstract void doSth();

		public int getPriority() {
			return priority;
		}
	}
	/*线程：pool-1-thread-1,正在执行优先级为：1的任务
线程：pool-1-thread-2,正在执行优先级为：2的任务
线程：pool-1-thread-3,正在执行优先级为：3的任务
============================================
队列中的线程开始排序
线程：pool-1-thread-2,正在执行优先级为：10的任务
线程：pool-1-thread-1,正在执行优先级为：9的任务
线程：pool-1-thread-3,正在执行优先级为：8的任务
线程：pool-1-thread-2,正在执行优先级为：7的任务
线程：pool-1-thread-1,正在执行优先级为：6的任务
线程：pool-1-thread-3,正在执行优先级为：5的任务
线程：pool-1-thread-2,正在执行优先级为：4的任务*/

}
